package com.malou.client.ventas.movimiento.entrada;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.HiddenField;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.malou.client.MalouConstants;
import com.malou.client.ventas.modeloprenda.ModeloPrendas;
import com.malou.client.ventas.tienda.Tiendas;

public class MovimientoEntradaDialog extends Dialog {
	
	private Button guardar;
	private Button cancelar;
	public Status status;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	
	public TextField<String> codigo;	
	public HiddenField<String> prenda_id;
	public ComboBox<BeanModel> prenda;
	private ComboBox<BeanModel> tienda;	
	private NumberField cantidad;	
	private Button addDetalle;
	private Button delDetalle;
		
	private ListStore<BeanModel> store;
	private Grid<BeanModel> grid;
	private ToolBar toolBar;
	
	public MovimientoEntradaDialog(){
		setLayout(new FitLayout());
		setModal(true);
		setPlain(true);
		setSize(850, 350);
		setClosable(true);
		
		FormPanel panel = new FormPanel();		
		panel.setBorders(false);
	    panel.setBodyBorder(false);
	    panel.setPadding(5);
	    panel.setHeaderVisible(false);
	    
	    addFields(panel);
	    
	    setButtonAlign(HorizontalAlignment.LEFT);
	    setButtons("");
	    add(panel);
	    
	    setBodyBorder(true);	    
	    setResizable(false);	    
	    setFocusWidget(codigo);
	    
	    setIconStyle("icon-stock");
		setHeading(constants.movimientoNuevo());
	}
	private void addFields(ContentPanel cp) {
		
		LayoutContainer main = new LayoutContainer();		
			    
	    FieldSet prenda_data = new FieldSet();
	    prenda_data.setHeading(constants.movimientoAgregarDetalle());	    
	    prenda_data.setLayout(new ColumnLayout());
	    
	    LayoutContainer lcodigo = new LayoutContainer();
	    FormLayout layout =new FormLayout();
		layout.setLabelWidth(45);
		lcodigo.setLayout(layout);
		
		prenda_id = new HiddenField<String>();
		lcodigo.add(prenda_id);
		
		ModeloPrendas.movimientoEntradaDialog = this;
		codigo = new TextField<String>();
		codigo.setFieldLabel(constants.movimientoCodigo());		
		
		codigo.addKeyListener(new KeyListener(){
			
			public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					if(codigo.getValue() != null){
						ModeloPrendas.getPrendaMovimientoEntrada(codigo.getValue());
						cantidad.focus();
					}
				}				
			}
		});
		
		lcodigo.add(codigo, new FormData(50,22));
		
		prenda_data.add(lcodigo, new ColumnData(.15));
		
		LayoutContainer lprenda = new LayoutContainer();
		lprenda.setStyleAttribute("paddingLeft", "10px");
	    layout =new FormLayout();
		layout.setLabelWidth(45);
		lprenda.setLayout(layout);
		
		ModeloPrendas.autoComplete();
		
		prenda = new ComboBox<BeanModel>();
		prenda.setFieldLabel(constants.movimientoPrenda());
		
		prenda.setDisplayField("nombre");			 	    
		prenda.setStore(ModeloPrendas.storeAutocomplete);		
		prenda.setValueField("nombre");
		prenda.setHideTrigger(true);  
		prenda.setPageSize(10);
		
		prenda.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {
			
			@Override
			public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
				if(se.getSelectedItem() != null){
				codigo.setValue(se.getSelectedItem().get("codigo").toString());
				prenda_id.setValue(se.getSelectedItem().get("id").toString());
				}
			}
		});
		
		lprenda.add(prenda, new FormData(170, 22));
		
		prenda_data.add(lprenda, new ColumnData(.31));
				
		
		LayoutContainer lcantidad = new LayoutContainer();
		lcantidad.setStyleAttribute("paddingLeft", "10px");
	    layout =new FormLayout();
		layout.setLabelWidth(50);
		lcantidad.setLayout(layout);
		
		cantidad = new NumberField();
		cantidad.setFieldLabel(constants.movimientoCantidad());		
		cantidad.setAllowNegative(false);
		cantidad.setAllowDecimals(false);
		cantidad.setPropertyEditorType(Integer.class);
		cantidad.setMinValue(1);
		
		lcantidad.add(cantidad,new FormData(45, 22));
		
		prenda_data.add(lcantidad, new ColumnData(.16));
		
		
		////////
		
		LayoutContainer ltienda = new LayoutContainer();
		ltienda.setStyleAttribute("paddingLeft", "10px");
	    layout =new FormLayout();
		layout.setLabelWidth(75);
		ltienda.setLayout(layout);
		
		Tiendas.getComboOtherTienda();
	    
	    tienda = new ComboBox<BeanModel>();  
	    tienda.setEditable(false);
	    tienda.setFieldLabel(constants.movimientoProcedencia());
	    tienda.setDisplayField("nombre");
	    tienda.setEmptyText("Seleccione...");	      
	    tienda.setStore(Tiendas.storeOtherCombo);  
	    tienda.setTypeAhead(true);  
	    tienda.setTriggerAction(TriggerAction.ALL);
	    tienda.setValueField("nombre");
	    tienda.setUseQueryCache(false);
	    
	    ltienda.add(tienda,new FormData(100, 22));
	    
	    prenda_data.add(ltienda, new ColumnData(.26));	    
		
		addDetalle = new Button(constants.agregar());
		addDetalle.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {
	    	  agregarDetalle();	    	  
	      }
	    });
		addDetalle.setStyleAttribute("paddingLeft", "10px");
		prenda_data.add(addDetalle, new ColumnData(.10));
		    
	    main.add(prenda_data, new FormData("100%"));
	    //detalle
	    toolBar = new ToolBar();
	    
	    delDetalle = new Button(constants.eliminar(), IconHelper.createPath("images/icons/delete.gif"));
	    delDetalle.setEnabled(false);
        
        SelectionListener<ButtonEvent> sl_del;        
        sl_del = new SelectionListener<ButtonEvent>(){
        	
        	@Override
			public void componentSelected(ButtonEvent ce) {		
				BeanModel be =grid.getSelectionModel().getSelectedItem();
				grid.getStore().remove(be);
			}
        };
        delDetalle.addSelectionListener(sl_del);
        toolBar.add(delDetalle);
	    
	    store = new ListStore<BeanModel>();
	    
	    RowNumberer r = new RowNumberer();
	    ArrayList<ColumnConfig> columns = new ArrayList<ColumnConfig>();
	    ColumnConfig column = new ColumnConfig();
	    columns.add(r);
	    columns.add(new ColumnConfig("codigo", constants.movimientoCodigo(), 80));
	    
		columns.add(new ColumnConfig("modeloprenda", constants.movimientoPrenda(), 500));
		        
        column = new ColumnConfig("cantidad", constants.movimientoCantidad(), 80);
        column.setAlignment(HorizontalAlignment.RIGHT);        
        columns.add(column); 
                  
        column = new ColumnConfig("tiendaorigen", constants.movimientoProcedencia(), 100);        
        columns.add(column);
        
        ColumnModel cm = new ColumnModel(columns);       
        
        grid = new Grid<BeanModel>(store, cm);
        grid.addPlugin(r);
        
        grid.getSelectionModel().addListener(Events.SelectionChange, new Listener<SelectionChangedEvent<BeanModel>>(){

			@Override
			public void handleEvent(SelectionChangedEvent<BeanModel> be) {				
				if(be.getSelectedItem() != null)
					delDetalle.setEnabled(true);
				else
					delDetalle.setEnabled(false);
			}
		});
        
        ContentPanel detalle = new ContentPanel();
        detalle.setHeaderVisible(false);
        detalle.setLayout(new FitLayout());
        detalle.setHeight(200);
        detalle.add(grid);
        detalle.setTopComponent(toolBar);        
        
        main.add(detalle, new FormData("100%"));
        
	    cp.add(main);
	}
	
	@Override
	  protected void createButtons() {
	    super.createButtons();
	    
	    if (constants == null) {
	    	constants = GWT.create(MalouConstants.class);
		}
	    
	    status = new Status();
	    status.setBusy(constants.guardando());
	    status.hide();
	    status.setAutoWidth(true);
	    getButtonBar().add(status);
	    
	    getButtonBar().add(new FillToolItem());
	    
	    cancelar = new Button(constants.cancelar());
	    
	    cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {	    	  
	    	  MovimientoEntradaDialog.this.hide();
	      }

	    });

	    guardar = new Button(constants.guardar());
	    
	    guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {
	    	  if(validarPrincipal()){
	    		  status.show();
	    		  getButtonBar().disable();
	    		  
	    		  List<MovimientoEntrada> list = new ArrayList<MovimientoEntrada>(); 
	    		  MovimientoEntrada me;
	    		  	    		  
	    		  for(BeanModel b:store.getModels()){
	    			  me = new MovimientoEntrada();
	    			  me.setModeloprenda_id(Integer.valueOf(b.get("modeloprenda_id").toString()));
	    			  //me.setModeloprenda(b.get("modeloprenda").toString());
	    			  me.setTiendaorigen_id(Integer.valueOf(b.get("tiendaorigen_id").toString()));
	    			  me.setCantidad(Integer.valueOf(b.get("cantidad").toString()));
	    			  me.setFecha(new Date());
	    			  list.add(me);	    			  
	    		  }	    		  
	    		  
	    		  MovimientoEntradas.movimientoEntradaDialog = MovimientoEntradaDialog.this;
	    		  MovimientoEntradas.save(list);
	    	  }	    	  
	      }
	    });
	    
	    addButton(guardar);
	    addButton(cancelar);	    
	    
	  }
	
	public boolean validarDetalle(){
		codigo.setAllowBlank(false);
		prenda.setAllowBlank(false);
		
		cantidad.setAllowBlank(false);
		tienda.setAllowBlank(false);
		
		boolean cod = codigo.isValid();
		boolean pre = prenda.isValid();
		
		boolean cant = cantidad.isValid();
		boolean tie = tienda.isValid();
		
		codigo.setAllowBlank(true);
		prenda.setAllowBlank(true);		
		cantidad.setAllowBlank(true);
		tienda.setAllowBlank(true);
		
		return cod && pre && cant && tie; 
	}
	
	public boolean validarPrincipal(){
		
		boolean det = true;
		if(store.getCount()==0){
			det = false;
			MessageBox.alert(constants.sistemaMarcocruzado(), constants.detalleRequerido(), null);
			codigo.focus();
		}
		
		return det;
	}
	
	public void clearDetalle(){
		  		  
		codigo.clear();
		prenda.clear();		
		cantidad.clear();
		tienda.clear();
		  
	 }
	public void clearPrincipal(){
		
		store.removeAll();
		clearDetalle();
		
	 }
	
	public void agregarDetalle(){
		if(validarDetalle()){
	    	  
	    	  Boolean add = true;
	    	  if(store.getCount() > 0){
	    		  String mp_id = prenda_id.getValue();
	    		  String tda_id = tienda.getValue().get("id").toString();
	    		  Integer cant = Integer.valueOf(cantidad.getValue().toString());	    		  
	    		  
	    		  String mpdetalle_id;
	    		  String tdadetalle_id;
	    		  Integer cantdetalle;
	    		  for(BeanModel b:store.getModels()){
	    			  mpdetalle_id = b.get("modeloprenda_id").toString();
	    			  tdadetalle_id = b.get("tiendaorigen_id").toString();
	    			  
	    			  if(mpdetalle_id.equals(mp_id) && tdadetalle_id.equals(tda_id)){
	    				  add = false;	    				
	    				  cantdetalle = b.get("cantidad");
	    				  	    				  
	    				  store.getRecord(b).set("cantidad", cantdetalle+cant);
	    				  
	    				  store.commitChanges();
	    				  clearDetalle();
	    				  codigo.focus();
	    				  
	    				  break;
	    			  }
	    		  }
		
	    	  }
	    	  if(add){
	    		  MovimientoEntrada dm = new MovimientoEntrada();
	    		  dm.setModeloprenda_id(Integer.valueOf(prenda_id.getValue()));
	    		  dm.setModeloprenda(prenda.getRawValue());
	    		  dm.setCodigo(codigo.getValue());		    	  
	    		  dm.setCantidad(Integer.valueOf(cantidad.getValue().toString()));
		    	  dm.setTiendaorigen_id(Integer.parseInt(tienda.getValue().get("id").toString()));
		    	  dm.setTiendaorigen(tienda.getValue().get("nombre").toString());
		    	  
		    	  BeanModelFactory beanModelFactory =  BeanModelLookup.get().getFactory(dm.getClass());
		    	  store.add(beanModelFactory.createModel(dm));
		    	  clearDetalle();
		    	  codigo.focus();
	    	  }		    	  
  	  }
	}
}
